home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / telecomm / xprogs.arc / XUP.C < prev    next >
C/C++ Source or Header  |  1988-01-05  |  3KB  |  174 lines

  1. /* xup.c    Xmodem upload program */
  2.  
  3. #include <bios.h>
  4. #include <osbind.h>
  5. #include <xbios.h>
  6.  
  7. #define Auxis() Bconstat(BC_AUX)
  8. #define Auxos() Bcostat(BC_AUX)
  9. #define Auxin() ((unsigned char) Bconin(BC_AUX))
  10. #define Auxout(c) Bconout(BC_AUX,c)
  11.  
  12. #define SOH 0x01
  13. #define EOT 0x04
  14. #define ACK 0x06
  15. #define NAK 0x15
  16. #define CAN 0x18
  17.  
  18. #define NULL (char *)0
  19. #define SIZE 128
  20. #define PACKETMAX 65000
  21. #define FALSE 0
  22. #define TRUE 1
  23.  
  24. extern    char    *itoa();
  25.  
  26. unsigned char    get_char();
  27.     char    packet[SIZE+1];
  28.  
  29. main(argc,argv)
  30.     int    argc;
  31.     char    *argv[];
  32. {
  33.     char    *name;
  34.     int    fp,n,i;
  35. unsigned int    ec,bytes,
  36.         packets,xpackets;
  37. unsigned char    chr,checksum;
  38.  
  39.     if (argc!=2)
  40.         fatal("Usage: xup file");
  41.     name=argv[1];
  42.     ec=10;
  43.     Cconws("\r\nxup v1.0 by Jason Blochowiak\r\n");
  44.     if ((fp=open(name,1))==-1)
  45.         fatal("Unable to open source file");
  46.  
  47.     flush();
  48.     do
  49.     {
  50.         if (((chr=get_char(60))==-1) || ((chr!=NAK) && (ec--==0)))
  51.             fatal("Initial timeout");
  52.     } while (chr!=NAK);
  53.     Cconws("\n\aReciever present, sending...\n");
  54.  
  55.     bytes=0;
  56.     for (packets=1;;)
  57.     {
  58.         Cconws("\rS#");
  59.         Cconws(itoa(packets));
  60.         for (i=0;i<SIZE;i++)
  61.             packet[i]=0;
  62.         xpackets=packets & 0xFF;
  63.         if ((n=read(fp,packet,SIZE))==0)
  64.             break;
  65.         if (n==-1)
  66.             fatal("Unable to read source file");
  67.         bytes+=n;
  68.         put_char(SOH);
  69.         put_char(xpackets);
  70.         put_char(xpackets ^ 0xFF);
  71.         checksum=0;
  72.         for (i=0;i<SIZE;i++)
  73.         {
  74.             checksum+=packet[i];
  75.             put_char(packet[i]);
  76.         };
  77.         put_char(checksum & 0xFF);
  78.         if (get_char(10)!=ACK)
  79.         {
  80.             Cconws("\r\nNAKed packet.\r\n");
  81.             if (ec--==0)
  82.                 fatal("Too many errors");
  83.             bytes-=n;
  84.             lseek(fp,(long) (packets-1)*128,0);
  85.         }
  86.         else
  87.             packets++;
  88.     };
  89.     ec=10;
  90.     do
  91.     {
  92.         put_char(EOT);
  93.     } while ((get_char(10)!=ACK) && (ec-->0));
  94.     if (close(fp)==-1)
  95.         fatal("Unable to close file.");
  96.     Cconws("xup: successful send.\n");
  97.     Cconin();
  98.     exit(0);
  99. }
  100.  
  101.  
  102. fatal(s)
  103.     char    *s;
  104. {
  105.     send_char(EOT);
  106.     Cconws("\r\nxup: ");
  107.     Cconws(s);
  108.     Cconws(".\r\n\a");
  109.     exit(1);
  110. }
  111.  
  112. read_packet(size,check)
  113. unsigned int    size;
  114. unsigned char    *check;
  115. {
  116. register int    i;
  117. unsigned char    cs;
  118.  
  119.     i=0;
  120.     while ( (i<size) && ((packet[i]=get_char(1))!=-1) )
  121.         cs=0xFF & (cs+=packet[i++]);
  122.     *check=cs ^ get_char(1);
  123.     return(i);
  124. }
  125.  
  126.  
  127. in_status()
  128. {
  129.     if (Auxis())
  130.         return(0);
  131.     else
  132.         return(1);
  133. }
  134.  
  135. out_status()
  136. {
  137.     if (Auxos())
  138.         return(0);
  139.     else
  140.         return(1);
  141. }
  142.  
  143. unsigned char    get_char(wait)
  144.     int    wait;
  145. {
  146. register int    i;
  147.  
  148.     for (i=0;i<wait*60;i++)
  149.         if (in_status())
  150.             Vsync();
  151.         else
  152.             return(Auxin()&0xff);
  153.     return(-1);
  154. }
  155.  
  156. put_char(c)
  157.     char    c;
  158. {
  159.     while (out_status());
  160.     Auxout(c);
  161. }
  162.  
  163. send_char(chr)
  164. unsigned char    chr;
  165. {
  166.     flush();
  167.     Auxout(chr);
  168. }
  169.  
  170. flush()
  171. {
  172.     while (get_char(1)!=-1);
  173. }
  174.